home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 2098 / 2098.xpi / chrome / updatenotifier.jar / content / overlay.js < prev    next >
Text File  |  2009-07-05  |  16KB  |  517 lines

  1. // Update Notifier
  2. // By Todd Long <longfocus@gmail.com>
  3. // http://www.longfocus.com/firefox/updatenotifier/
  4.  
  5. const UN_NOTIFY_TOPIC = "UN:update-topic";
  6. const UN_NOTIFY_TYPE_CHANGE = "UN:update-type-change";
  7. const UN_NOTIFY_TYPE_RESTART = "UN:update-type-restart";
  8. const UN_NOTIFY_TYPE_BUSY_NONE = "UN:update-type-busy-none";
  9. const UN_NOTIFY_TYPE_BUSY_CHECKING = "UN:update-type-busy-checking";
  10. const UN_NOTIFY_TYPE_BUSY_DOWNLOAD = "UN:update-type-busy-download";
  11. const UN_NOTIFY_TYPE_BUSY_INSTALL = "UN:update-type-busy-install";
  12.  
  13. function UN_onOverlayLoad() {
  14.   UN_gOverlay.load();
  15. }
  16.  
  17. function UN_onOverlayUnload() {
  18.   UN_gOverlay.unload();
  19. }
  20.  
  21. var UN_gOverlay = {
  22.   _em: null,
  23.   _branchWatch: null,
  24.   _observer: null,
  25.   _restart: false,
  26.   _busyStatus: UN_NOTIFY_TYPE_BUSY_NONE,
  27.   
  28.   load: function()
  29.   {
  30.     // Initialization
  31.     this._em = UN_CC["@mozilla.org/extensions/manager;1"].getService(UN_CI.nsIExtensionManager);
  32.     
  33.     // Preferences
  34.     this._branchWatch = UN_getBranch().QueryInterface(UN_CI.nsIPrefBranch2);
  35.     this._branchWatch.addObserver("", this, false);
  36.     
  37.     // Adds the observer for new updates
  38.     this._observer = UN_CC["@mozilla.org/observer-service;1"].getService(UN_CI.nsIObserverService);
  39.     this._observer.addObserver(this, UN_NOTIFY_TOPIC, false);
  40.     
  41.     // Load manager
  42.     UN_getManager().load();
  43.     
  44.     // Initialize update state
  45.     this._restart = UN_getManager().restart;
  46.     this._busyStatus = UN_getManager().status;
  47.     
  48.     // Check preferences
  49.     this._checkPrefs();
  50.   },
  51.   
  52.   unload: function()
  53.   {
  54.     // Removes the observers
  55.     this._branchWatch.removeObserver("", this);
  56.     this._observer.removeObserver(this, UN_NOTIFY_TOPIC);
  57.   },
  58.   
  59.   _checkPrefs: function()
  60.   {
  61.     // Check first time run
  62.     if (UN_getBoolPref("first-time"))
  63.     {
  64.       // Check for Firefox menu
  65.       var tb = UN_getEBI("toolbar-menubar");
  66.       
  67.       // Check for Thunderbird 2.0b1 menu
  68.       if (!tb)
  69.         tb = UN_getEBI("mail-bar");
  70.       
  71.       // Check for Thunderbird 2.0.0.* menu
  72.       if (!tb)
  73.         tb = UN_getEBI("mail-toolbar-menubar2");
  74.       
  75.       // Check for Sunbird menu
  76.       if (!tb)
  77.         tb = UN_getEBI("calendar-bar");
  78.       
  79.       // Check for Mac/Songbird menu
  80.       if (!tb)
  81.         tb = UN_getEBI("nav-bar");
  82.       
  83.       if (tb && tb.currentSet && tb.currentSet.indexOf("un-toolbarbutton") == -1)
  84.       {
  85.         if (tb.currentSet.indexOf("throbber-box") > -1)
  86.           tb.currentSet = tb.currentSet.replace("throbber-box", "un-toolbarbutton,throbber-box");
  87.         else
  88.         {
  89.           // Check for Firefox 3.5 which lacks the spring
  90.           if (tb.lastChild.id == "menubar-items")
  91.           {
  92.             var spring = document.createElement("toolbarspring");
  93.             spring.setAttribute("class", "chromeclass-toolbar-additional");
  94.             tb.appendChild(spring);
  95.           }
  96.           
  97.           tb.currentSet += ",un-toolbarbutton";
  98.         }
  99.         
  100.         tb.setAttribute("currentset", tb.currentSet);
  101.         document.persist(tb.id, "currentset");
  102.         
  103.         if (UN_isFirefox()) {
  104.           try {
  105.             BrowserToolboxCustomizeDone(true);
  106.           } catch (e) {}
  107.         }
  108.       }
  109.       
  110.       // Set first time run to false
  111.       UN_setBoolPref("first-time", "false");
  112.     }
  113.     
  114.     // Updates the icons
  115.     this._updateIcons();
  116.     
  117.     // Checks the statusbar
  118.     this._checkStatusbar();
  119.   },
  120.   
  121.   _updateIcons: function()
  122.   {
  123.     var items = UN_getManager().getItems({});
  124.     var extensions = false;
  125.     var themes = false;
  126.     var icon = "none";
  127.     var collapsed = false;
  128.     
  129.     for (var i = 0; i < items.length; i++) {
  130.       var item = items[i];
  131.       
  132.       if (item.type == "extension" && item.newVersion != null)
  133.         extensions = true;
  134.       else if (item.type == "theme" && item.newVersion != null)
  135.         themes = true;
  136.     }
  137.     
  138.     // Set icon type
  139.     if (this._busyStatus != UN_NOTIFY_TYPE_BUSY_NONE)
  140.       icon = "busy";
  141.     else if (this._restart)
  142.       icon = "restart"
  143.     else if (extensions && !themes)
  144.       icon = "extension"
  145.     else if (!extensions && themes)
  146.       icon = "theme";
  147.     else if (extensions && themes)
  148.       icon = "both";
  149.     
  150.     // Set icon collapsed
  151.     if (!this._restart && !extensions && !themes)
  152.       collapsed = !UN_getBoolPref("icon.always-display");
  153.     
  154.     // Set toolbar icons
  155.     if (UN_getEBI("un-toolbarbutton")) {
  156.         UN_setEBIA("un-toolbarbutton", "icon", icon);
  157.       UN_setEBIA("un-toolbarbutton", "collapsed", collapsed);
  158.     }
  159.     
  160.     // Set statusbar icons
  161.     UN_setEBIA("un-statusbar-panel", "icon", icon);
  162.     UN_setEBIA("un-statusbar-panel", "collapsed", collapsed);
  163.   },
  164.   
  165.   _checkStatusbar: function()
  166.   {
  167.     var sbar = UN_getEBI("status-bar");
  168.     var sbarPanel = UN_getEBI("un-statusbar-panel");
  169.     
  170.     sbarPanel.hidden = !UN_getBoolPref("statusbar");
  171.     sbar.removeChild(sbarPanel);
  172.     
  173.     if (UN_getBoolPref("statusbar.always-last"))
  174.       sbar.appendChild(sbarPanel);
  175.     else {
  176.       var pos = UN_getIntPref("statusbar.position");
  177.       sbar.insertBefore(sbarPanel, sbar.childNodes[pos]);
  178.     }
  179.   },
  180.   
  181.   checkRestart: function(aAuto)
  182.   {
  183.     var msg = null;
  184.     var display = true;
  185.     
  186.     if (aAuto)
  187.     {
  188.       var items = UN_getManager().getItems({});
  189.       var updateList = "";
  190.       
  191.       for (var i = 0; i < items.length; i++) {
  192.         if (items[i].needsRestart)
  193.           updateList += "\n" + items[i].name + " " + items[i].oldVersion + " " + UN_getBundleString(items[i].opType == "needs-upgrade" ? "tb-tooltip-upgraded" : "tb-tooltip-installed");
  194.       }
  195.       
  196.       if (updateList != "")
  197.         updateList += "\n";
  198.       
  199.       msg = UN_getBundleFString("un-confirm-restart-auto", [updateList, UN_getPlatform()]);
  200.     }
  201.     else
  202.       msg = UN_getBundleFString("un-confirm-restart", [UN_getPlatform()]);
  203.     
  204.     try {
  205.       if (getBrowser() != UN_getBrowser().getBrowser())
  206.         display = false;
  207.     } catch(e) {}
  208.     
  209.     if (display) {
  210.       var check = {value: !UN_getBoolPref("restart.prompt")};
  211.       if (check.value || UN_confirmCheck(msg, check)) {
  212.         UN_setBoolPref("restart.prompt", !check.value);
  213.         UN_restart();
  214.       }
  215.     }
  216.   },
  217.   
  218.   populatePopup: function(aId)
  219.   {
  220.     var items = UN_getManager().getItems({});
  221.     var restart = false;
  222.     var popup = UN_getEBI(aId);
  223.     var item = null;
  224.     
  225.     for (var i = 0; i < items.length && !restart; i++)
  226.       restart = (items[i].newVersion != null);
  227.     
  228.     while (popup.hasChildNodes())
  229.       popup.removeChild(popup.lastChild);
  230.     
  231.     item = document.createElement("menuitem");
  232.     item.setAttribute("label", UN_getBundleString("tb-popup-menu-check-all-updates"));
  233.     item.setAttribute("oncommand", "UN_getManager().checkUpdates();");
  234.     popup.appendChild(item);
  235.     
  236.     item = document.createElement("menuitem");
  237.     item.setAttribute("label", UN_getBundleString("tb-popup-menu-install-all-updates"));
  238.     item.setAttribute("oncommand", "UN_getManager().installUpdates();");
  239.     item.setAttribute("disabled", !restart);
  240.     popup.appendChild(item);
  241.     
  242.     item = document.createElement("menuitem");
  243.     item.setAttribute("label", UN_getBundleFString("tb-popup-menu-restart", [UN_getPlatform()]));
  244.     item.setAttribute("oncommand", "UN_gOverlay.checkRestart(false);");
  245.     popup.appendChild(item);
  246.     
  247.     popup.appendChild(document.createElement("menuseparator"));
  248.     
  249.     var isNewAddOnsDialog = true;
  250.     var addOnsFunctionName = null;
  251.     
  252.     // Check which function will be used for opening the "Add-Ons" dialog
  253.     if (typeof BrowserOpenAddonsMgr == "function")
  254.     {
  255.       // Firefox 2.0.0.*
  256.       addOnsFunctionName = "BrowserOpenAddonsMgr()";
  257.     }
  258.     else if (typeof openAddonsMgr == "function")
  259.     {
  260.       // Thunderbird 2.0.0.*
  261.       addOnsFunctionName = "openAddonsMgr()";
  262.     }
  263.     else if (typeof goOpenAddons == "function")
  264.     {
  265.       // Sunbird 0.2 to 0.8
  266.       addOnsFunctionName = "goOpenAddons()";
  267.     }
  268.     else if (typeof SBOpenPreferences == "function")
  269.     {
  270.       // Songbird 0.5
  271.       addOnsFunctionName = "SBOpenPreferences('paneAddons')";
  272.     }
  273.     else if (typeof BrowserOpenExtensions == "function")
  274.     {
  275.       // Firefox 1.5.0.*
  276.       isNewAddOnsDialog = false;
  277.       addOnsFunctionName = "BrowserOpenExtensions";
  278.     }
  279.     else if (typeof openExtensions == "function")
  280.     {
  281.       // Thunderbird 1.5.0.*
  282.       isNewAddOnsDialog = false;
  283.       addOnsFunctionName = "openExtensions";
  284.     }
  285.     else if (typeof toEM == "function")
  286.     {
  287.       // SeaMonkey 2.0a3
  288.       isNewAddOnsDialog = false;
  289.       addOnsFunctionName = "toEM";
  290.     }
  291.     
  292.     if (addOnsFunctionName)
  293.     {
  294.       if (isNewAddOnsDialog)
  295.       {
  296.         item = document.createElement("menuitem");
  297.         item.setAttribute("label", UN_getBundleString("tb-popup-menu-addons"));
  298.         item.setAttribute("oncommand", addOnsFunctionName);
  299.         popup.appendChild(item);
  300.       }
  301.       else
  302.       {
  303.         item = document.createElement("menuitem");
  304.         item.setAttribute("label", UN_getBundleString("tb-popup-menu-extensions"));
  305.         item.setAttribute("oncommand", addOnsFunctionName + "('extensions');");
  306.         popup.appendChild(item);
  307.         
  308.         item = document.createElement("menuitem");
  309.         item.setAttribute("label", UN_getBundleString("tb-popup-menu-themes"));
  310.         item.setAttribute("oncommand", addOnsFunctionName + "('themes');");
  311.         popup.appendChild(item);
  312.         
  313.         // TODO: Plugins
  314.       }
  315.       
  316.       popup.appendChild(document.createElement("menuseparator"));
  317.     }
  318.     
  319.     item = document.createElement("menuitem");
  320.     item.setAttribute("label", UN_getBundleString("tb-popup-menu-homepage"));
  321.     item.setAttribute("oncommand", "UN_visitSite(UN_WEBSITE);");
  322.     popup.appendChild(item);
  323.     
  324.     item = document.createElement("menuitem");
  325.     item.setAttribute("label", UN_getBundleString("tb-popup-menu-options"));
  326.     item.setAttribute("default", "true");
  327.     item.setAttribute("oncommand", "window.openDialog('chrome://updatenotifier/content/options.xul', 'UN:Prefs', 'centerscreen,chrome,dependent');");
  328.     popup.appendChild(item);
  329.   },
  330.   
  331.   populateTooltip: function()
  332.   {
  333.     var items = UN_getManager().getItems({});
  334.     var itemUpdates = 0;
  335.     var tte = UN_getEBI("un-toolbar-tooltip-updates-extensions");
  336.     var ttt = UN_getEBI("un-toolbar-tooltip-updates-themes");
  337.     
  338.     // Remove all extensions
  339.     while (tte.hasChildNodes())
  340.       tte.removeChild(tte.lastChild);
  341.     
  342.     // Remove all extensions
  343.     while (ttt.hasChildNodes())
  344.       ttt.removeChild(ttt.lastChild);
  345.     
  346.     for (var i = 0; i < items.length; i++)
  347.     {
  348.       // Create item row
  349.       var itemRow = document.createElement("row");
  350.       
  351.       // Create item image
  352.       var itemImage = document.createElement("image");
  353.       itemImage.setAttribute("class", "un-icons");
  354.       itemImage.setAttribute("icon", items[i].type);
  355.       itemRow.appendChild(itemImage);
  356.       
  357.       if (items[i].needsRestart && this._restart)
  358.       {
  359.         // Create label with item name
  360.         var itemLabel = document.createElement("label");
  361.         itemLabel.setAttribute("value", items[i].name + " " + items[i].oldVersion);
  362.         itemRow.appendChild(itemLabel);
  363.         
  364.         // Create label with install type
  365.         var itemLabel = document.createElement("label");
  366.         itemLabel.setAttribute("value", UN_getBundleString((items[i].opType == "needs-upgrade" ? "tb-tooltip-upgraded" : "tb-tooltip-installed")));
  367.         itemRow.appendChild(itemLabel);
  368.       }
  369.       else if (!items[i].needsRestart && !this._restart)
  370.       {
  371.         // Create label with new version
  372.         var itemLabel = document.createElement("label");
  373.         itemLabel.setAttribute("class", "bold");
  374.         itemLabel.setAttribute("value", items[i].name + " " + items[i].newVersion);
  375.         itemRow.appendChild(itemLabel);
  376.         
  377.         // Create label with old version
  378.         var itemLabel = document.createElement("label");
  379.         itemLabel.setAttribute("value", "(" + UN_getBundleString("tb-tooltip-currently") + " " + items[i].oldVersion + ")");
  380.         itemRow.appendChild(itemLabel);
  381.       }
  382.       else
  383.         continue;
  384.       
  385.       itemUpdates++;
  386.       
  387.       switch(items[i].type)
  388.       {
  389.         case "extension":
  390.           tte.appendChild(itemRow);
  391.           break;
  392.         case "theme":
  393.           ttt.appendChild(itemRow);
  394.           break;
  395.       }
  396.     }
  397.     
  398.     // Set tooltip
  399.     if (this._busyStatus == UN_NOTIFY_TYPE_BUSY_CHECKING)
  400.     {
  401.       // Checking for updates
  402.       UN_setEBIA("un-toolbar-tooltip-header-label", "value", UN_getBundleString("tb-tooltip-checking"));
  403.     }
  404.     else if (this._busyStatus == UN_NOTIFY_TYPE_BUSY_DOWNLOAD)
  405.     {
  406.       // Installing new updates
  407.       UN_setEBIA("un-toolbar-tooltip-header-label", "value", UN_getBundleString("tb-tooltip-download"));
  408.     }
  409.     else if (this._busyStatus == UN_NOTIFY_TYPE_BUSY_INSTALL)
  410.     {
  411.       // Installing new updates
  412.       UN_setEBIA("un-toolbar-tooltip-header-label", "value", UN_getBundleString("tb-tooltip-install"));
  413.     }
  414.     else if (this._restart)
  415.     {
  416.       // Restart is required
  417.       UN_setEBIA("un-toolbar-tooltip-header-label", "value", UN_getBundleString("tb-tooltip-restart"));
  418.     }
  419.     else if (itemUpdates == 0)
  420.     {
  421.       // No available updates
  422.       UN_setEBIA("un-toolbar-tooltip-header-label", "value", UN_getBundleString("tb-tooltip-no-updates"));
  423.     }
  424.     else
  425.     {
  426.       // Updates available header
  427.       if (itemUpdates == 1)
  428.         UN_setEBIA("un-toolbar-tooltip-header-label", "value", UN_getBundleString("tb-tooltip-new-update"));
  429.       else
  430.         UN_setEBIA("un-toolbar-tooltip-header-label", "value", UN_getBundleFString("tb-tooltip-new-updates", [itemUpdates]));
  431.     }
  432.     
  433.     // Extensions
  434.     tte.parentNode.setAttribute("collapsed", !tte.hasChildNodes());
  435.     tte.parentNode.setAttribute("hidden", !tte.hasChildNodes());
  436.     
  437.     // Themes
  438.     ttt.parentNode.setAttribute("collapsed", !ttt.hasChildNodes());
  439.     ttt.parentNode.setAttribute("hidden", !ttt.hasChildNodes());
  440.     
  441.     // Display updates appropriately
  442.     UN_setEBIA("un-toolbar-tooltip-updates", "collapsed", (this._checking || itemUpdates == 0));
  443.   },
  444.   
  445.   toolbarClick: function(aEvent)
  446.   {
  447.     // Check for middle click
  448.     if (aEvent.button == 1)
  449.       UN_getManager().checkUpdates();
  450.   },
  451.   
  452.   observe: function(aSubject, aTopic, aData)
  453.   {
  454.     if (aTopic == "nsPref:changed")
  455.     {
  456.       switch (aData)
  457.       {
  458.         case "auto.install":
  459.         {
  460.           // Check for auto install
  461.           if (UN_getBoolPref("auto.install"))
  462.             setTimeout("UN_getManager().installUpdates()", 1000);
  463.           
  464.           break;
  465.         }
  466.         case "icon.always-display":
  467.         {
  468.           // Updates the icons
  469.           this._updateIcons();
  470.           break;
  471.         }
  472.         case "statusbar":
  473.         case "statusbar.always-last":
  474.         case "statusbar.position":
  475.         {
  476.           // Checks the statusbar
  477.           this._checkStatusbar();
  478.           break;
  479.         }
  480.       }
  481.     }
  482.     else if (aTopic == UN_NOTIFY_TOPIC)
  483.     {
  484.       // Check notify type
  485.       switch (aData)
  486.       {
  487.         case UN_NOTIFY_TYPE_CHANGE:
  488.         {
  489.           // Check for auto install
  490.           if (UN_getBoolPref("auto.install"))
  491.             setTimeout("UN_getManager().installUpdates()", 1000);
  492.           
  493.           // Check for restart
  494.           this._restart = UN_getManager().restart;
  495.           
  496.           // Check for auto restart
  497.           if (this._restart && UN_getBoolPref("auto.restart"))
  498.             setTimeout("UN_gOverlay.checkRestart(true)", 1000);
  499.           
  500.           break;
  501.         }
  502.         case UN_NOTIFY_TYPE_BUSY_NONE:
  503.         case UN_NOTIFY_TYPE_BUSY_CHECKING:
  504.         case UN_NOTIFY_TYPE_BUSY_DOWNLOAD:
  505.         case UN_NOTIFY_TYPE_BUSY_INSTALL:
  506.         {
  507.           // Sets the busy status
  508.           this._busyStatus = aData;
  509.           break;
  510.         }
  511.       }
  512.       
  513.       // Updates the icons
  514.       this._updateIcons();
  515.     }
  516.   }
  517. }